<?php

/**
 *  Permet de connecter un utilisateur
 * @param jsonarray $in Données envoyées en POST
 * @param jsonarray $out Données renvoyées au client (pointeur)
 * @param SQLite_resource $db DB SQLite
 */
function connecter_serveur($action, &$out, $db) {
    $out["action"] = "connecter_serveur";
    if (Joueur::exists($action["nom_joueur"], $db)) {
        $out["ok"] = 0;
    } else {
        $joueurinscrit = new Joueur($action["nom_joueur"], $db);
        $out["token"] = $joueurinscrit->getToken();
        $out["ok"] = 1;
    }
}

function creer_partie($action, &$out, $db) {
    if (is_string($action["nom_partie"])) {
        $partiecréée = new Partie($action["nom_partie"], $db);
        $out["action"] = "creer_partie";
        $out["ok"] = 1;
        $out["id_partie"] = $partiecréée->getIdPartie();
    } else {
        $out["ok"] = 0;
    }
}

function recup_liste_parties($action, &$out, $joueur, $db) {
    //$joueur = Joueur::getJoueur($token, $db);
    //$joueur->delierPartie();
    $joueur->update();
    Joueur::disconnect($db);
    //Partie::nettoyer($db);
    $out["ok"] = 1;
    $out['action'] = 'recup_liste_parties';
    $out['liste_parties'] = Partie::getParties($db);
}

function rejoindre_partie($action, &$out, $joueur, $db) {
    $out['action'] = 'rejoindre_partie'; //id_partie
    //$joueur = Joueur::getJoueur(strval($token), $db);
    if ($joueur == null) {
        $out["ok"] = 0;
        $out["DEBUG_message"] = "Le joueur n'a pas été trouvé grace au Token!";
    } else {
        $partie = new Partie(intval($action["id_partie"]), $db);
        if ($partie == null) {
            $out["ok"] = 0;
            $out["DEBUG_message"] = "La partie semble introuvable !";
        } else {
            if ($idEvenement = $joueur->lierPartie($partie)) {
                $out["ok"] = 1;
                $joueurs = $partie->getJoueurs();
                $out["place"] = $joueur->getPosition();
                $out["liste_joueurs"] = array();
                $out["id_evenement"] = $idEvenement;
                foreach ($joueurs as $k => $v) {
                    $out["liste_joueurs"][] = $v->toarray();
                }
            } else {
                $out["ok"] = 0;
                $out["DEBUG_message"] = "La partie est pleine(" . sizeof($partie->getJoueurs()) . "/4) ou le joueur est déjà dans une partie(" . $joueur->getPartie()->getIdPartie() . ")";
                $out["DEBUG_partie"] = $partie->toarray();
                $out["DEBUG_joueur"] = $joueur->toarray();
            }
        }
    }
}

function etat_partie($action, &$out, $joueur, $db) {
    log_it(__METHOD__, 1);
    //$joueur = Joueur::getJoueur($token, $db);
    $partie = $joueur->getPartie();
    $joueur->update();
    Joueur::disconnect($db);
    if (isset($action["id_evenement"]))
        $lastid = $action["id_evenement"];
    else
        $lastid= - 1;
    $events = $partie->getEvenementSince($lastid, $db);
    $r = array();
    foreach ($events as $key => $event) {
        $r[] = $event->toArray();
    }
    log_it("Evenements : " . sizeof($r), 0);
    Evenement::filter($r, $joueur);
    $out = array_merge($out, $r);
    log_it("/" . __METHOD__, -1);
}

/**
 *
 * @param type $action  
 * @param array $out
 * @param type $db 
 * @todo
 *  - Verifier que la carte est bien dans le jeu du joueur
 *  - Verifier que le jeu n'est pas bloqué (Les choix de couleurs sont faits et les cartes a piochées sont piochées)
 *      - Verifier que la couleur de la carte est égale a la couleur du talon
 *          OU
 *      - Que la valeur du talon est égale a la valeur de la carte
 *  - Creer un evenement de déplacement de carte du jeu du joueur au talon
 *  - OK = 1 si on est arrivé jusque là
 */
/*
  function poser_carte($action, $out, $token, $db) {
  $out['action'] = 'poser_carte';
  $joueur = Joueur::getJoueur($token, $db);
  $partie = $joueur->getPartie();
  $carteTalon=$partie->getCarteTalon();
  $carte=$action["carte"];
  if($carteTalon peut po jouer){                       //on passe notre tour, on ne peut donc pas poser de carte
  Evenement::create('next', $joueur->getPosition(),$partie, $action["passer_tour"]);
  }
  elseif(getCarte($carte)==$carteTalon){                      //on verifie que l'on possede un +2
  Evenement::                                             //si oui on peut le poser
  }
  elseif(joueur avant poser carte special +4et si on a +4){   //on verifie que l'on possede un +4
  //si oui on peut le poser
  }
  elseif(){                    //on verifie que l'on possede une carte
  //de la meme couleur que la carte sur le talon
  }
  elseif(carte::getCouleur($carte)==$partie->getCouleur() || carte::compatible($carte, $carteTalon)) {  //on verifie si on possede une carte de la meme couleur
  Evenement::create("mouvement_carte", 5, $partie, $carte);                                          //ou du meme chiffre que sur le talon
  $out["ok"]=1;
  }
  else {

  }

  }
 */
function choix_couleur($action, &$out, $joueur, $db) {
    $out['action'] = 'choix_couleur';
    $partie = $joueur->getPartie();
    Evenement::create('changement_couleur', $joueur, $partie, $action["couleur"]);
    $out['ok'] = 1;
}

function uno($action, &$out, $joueur, $db) {
    $out['action'] = 'uno';
    $partie = $joueur->getPartie();
    if (sizeof($joueur->getCartes()) == 1) {
        Evenement::create("event_uno", $joueur, $partie, '');
        $out["ok"] = 1;
    } else {
        $out["ok"] = 0;
    }
}

function commencer_partie($action, &$out, joueur $joueur, $db) {
    $out["action"] = "commencer_partie";
    log_it(__METHOD__, 1);
    $partie = $joueur->getPartie();
    $out["ok"] = 1;

    if ($joueur->getPosition() == 0)
        if (!$partie->commencer()) {
            $out["ok"] = 0;
            $out["DEBUG_message"] = "La partie n'a pas commencée";
        } else {
            $out["ok"] = 0;
            $out["DEBUG_message"] = "Le joueur n'est pas le créateur de la partie";
        }
    log_it("/" . __METHOD__, -1);
}

function contre_uno($action, &$out, $joueur, $db) {
    $partie = $joueur->getPartie();
    $cible = $partie->getJoueur(intval($action["numero_joueur"]));
    if ($cible->isContreUnoable()) {
        Evenement::create("event_contre_uno", $joueur, $partie, $cible->getPosition());
        $cible->piocher();
        $out["ok"] = 1;
    } else {
        $joueur->piocher();
        $out["ok"] = 0;
    }
}

/*function supprimer_joueur($action, &$out, $joueur, $db) {
    $out['action'] = 'supprimer_joueur';
    $joueur->delierPartie();
}*/

function supprimer($action, &$out, $joueur, $db) {
    $out['action'] = 'supprimer';
    $out['ok'] = 0;
    $partie = $joueur->getPartie();
    if (!$partie->getDebut() && $joueur->delierPartie()) {
        $out['ok'] = 1;
    }
}

/*
 * regard c'est dans ton tour
 * 
 */

function piocher($action, &$out, Joueur $joueur, $db) {
    $out['action'] = 'piocher_carte';
    log_it(__METHOD__, 1);
    $partie = $joueur->getPartie();
    if ($partie->isBloquee()) {
        $out["ok"] = 0;
        return;
    }
    $tour = $partie->getTours();
    if ($tour == $joueur->getPosition()) {
        $nbcartes = $partie->getCartesAPiocher() - 1;
        $joueur->piocher();
        while ($nbcartes > 0) {
            $joueur->piocher();
            $nbcartes--;
        }
        $partie->toursSuivant();
        $out["ok"] = 1;
    } else {
        $out["ok"] = 0;
    }
    log_it("/" . __METHOD__, -1);
}

function poser_carte($action, &$out, Joueur $joueur, $db) {
    $out["action"] = "poser_carte";
    if ($joueur->poserCarte($action["id_carte"])) {
        $out["ok"] = 1;
    } else {
        $out["ok"] = 0;
    }
}

function chat($action, &$out, Joueur $joueur, $db) {
    $action["action"]="chat";
    $message = substr(trim($action["message"]), 0,255);
    Evenement::create("event_chat", $joueur, $joueur->getPartie(), $message);
    $action["ok"]=1;
}